define([
	"./core",
	"./core/init",
	"./manipulation", // clone
	"./traversing" // parent, contents
],function(jQuery){

jQuery.fn.extend({
	// 只能针对单个元素，wrap方法可以是多个元素
	// html可以是选择器，将拷贝页面上的元素用来包裹当前元素，被拷贝对象在页面既有两份
	// 或html字符串，形成dom元素插在当前元素前头，在把当前元素用循环语句插入该dom最底层
	wrapAll:function(html){
		var wrap;

		if ( this[0] ){
			if ( jQuery.isFunction(html) ){
				html=html.call(this[0]);
			}

			wrap=jQuery(html,this[0].ownerDocument).eq(0).clone(true);

			if ( this[0].parentNode ){
				wrap.insertBefore(this[0]);
			}

			wrap.map(function(){
				var elem=this;

				while ( elem.firstElementChild ){
					elem=elem.firstElementChild;
				}

				return elem;
			}).append(this);
		}

		return this;
	},

	// 当前元素的子元素使用html包裹
	wrapInner:function(html){
		if ( jQuery.isFunction(html) ){
			return this.each(function(i){
				jQuery(this).wrapInner(html.call(this,i));
			} );
		}

		return this.each(function(){
			var self=jQuery(this),
				contents=self.contents();// 子元素

			if ( contents.length ){
				contents.wrapAll(html);
			}else{
				self.append(html);
			}
		});
	},

	wrap:function(html){
		var isFunction=jQuery.isFunction(html);

		return this.each(function(i){
			jQuery(this).wrapAll(isFunction ? html.call(this,i) : html);
		});
	},

	// 移除匹配selector的父节点
	unwrap:function(selector){
		this.parent(selector).not("body").each(function(){
			jQuery(this).replaceWith(this.childNodes);
		});
		return this;
	}
});

return jQuery;
});